package jermedit.gobjekte;


import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.geom.Line2D;


 // Vererbung
 // wir haben Position 1 und 2 => 2 andere Positionen 

public class Generalization extends LineObject{

    private Polygon pfeil;
    private Math m;
    private double phi;      // Rotationswinkel 
    private double s = 10.0d;      // Seitenlaenge des Pfeils 
    private double xAlt, yAlt;          // x-,y-Werte vor der Rotation,relativ zur Pfeilspitze 
    private double xNeu, yNeu;          // x-,y-Werte nach der Rotation,absolut 
    private double xSpitze, ySpitze;    // x-,y-Werte der Pfeilspitze 
    
    public Generalization(int x1, int y1, int x2, int y2){
        super(x1,y1,x2,y2);
        genArrow(); 
    }
    
    @Override
    public void setPointx(int point, int x, int y){
            super.setPointx(point, x, y);
            genArrow();
    }
    
    public void drawSubStroke(Graphics2D g2){
        //Dummy?
    }
    
    @Override
    public void drawSub(Graphics2D g2) {
        g2.draw(new Line2D.Double(this.getVonX(),this.getVonY(),this.getNachX(),this.getNachY()));
        g2.fillPolygon(pfeil);
    }

    private void genArrow() {
        //Hier wird die Pfeilspitze mithilfe unserer 2 Punkte der Linie erstellt.
        phi = m.atan( ((double)this.getNachY()  -  (double)this.getVonY() ) / ((double)this.getNachX()  -  (double)this.getVonX() ) ); 
        if(this.getNachX() < this.getVonX() ){ 
            phi = phi + m.PI; 
        }
        // den Generalization zeichnen 
        // In methode bewegen
        pfeil = new Polygon(); 
        pfeil.addPoint(this.getNachX() , this.getNachY() );  // Pfeilspitze 
        // Die beiden anderen Punkte des Pfeils müssen um den Winkel phi relativ zur 
        // Pfeilspitze rotiert werden. 
        // x_rot = x*cos(phi) - y*sin(phi) 
        // y_rot = x*sin(phi) + y*cos(phi) 
        xSpitze = (double)this.getNachX(); 
        ySpitze = (double)this.getNachY(); 
        // erster Punkt 
        xAlt = (double)this.getNachX() - s - xSpitze; 
        yAlt = (double)this.getNachY() + s/2.5 - ySpitze; 
        xNeu = xAlt * m.cos(phi) - yAlt * m.sin(phi) + xSpitze; 
        yNeu = xAlt * m.sin(phi) + yAlt * m.cos(phi) + ySpitze; 
        pfeil.addPoint((int)xNeu, (int)yNeu); 
        // zweiter Punkt 
        yAlt = (double)this.getNachY() - s/2.5 - ySpitze; 
        xNeu = xAlt * m.cos(phi) - yAlt * m.sin(phi) + xSpitze; 
        yNeu = xAlt * m.sin(phi) + yAlt * m.cos(phi) + ySpitze; 
        pfeil.addPoint((int)xNeu, (int)yNeu);
    }
    
}
